﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Csla;
using Csla.Tools;
using Csla.Validation;
using Csla.Data;
using System.Data;
using DemoCSLA.DalLinq;

namespace DemoCSLA.Libreria.Editables
{

    //******************************************
    //Clase generada por un Snippet de Erick Orlando © 2010
    //******************************************


    //Agregue aqui las importaciones necesarias

    [Serializable()]
    public partial class FacturaDetalle : BusinessBase<FacturaDetalle>, IEquatable<FacturaDetalle>
    {

        #region Propiedades públicas

        private static PropertyInfo<string> m_IdFacturaDetalle =
            RegisterProperty<string>(c => c.IdFacturaDetalle);
        public string IdFacturaDetalle
        {
            get { return GetProperty(m_IdFacturaDetalle); }
            set { SetProperty(m_IdFacturaDetalle, value); }
        }


        private static PropertyInfo<string> m_IdProducto = RegisterProperty<string>(c => c.IdProducto);
        public string IdProducto
        {
            get { return GetProperty(m_IdProducto); }
            set { SetProperty(m_IdProducto, value); }
        }


        private static PropertyInfo<string> m_Producto = RegisterProperty<string>(c => c.Producto);
        public string Producto
        {
            get
            {
                if (ReadProperty(m_Descripcion) != String.Empty)
                    SetProperty(m_Producto, string.Format("{0} - {1}",
                        ReadProperty(m_Codigo), ReadProperty(m_Descripcion)));
                return GetProperty(m_Producto);
            }
        }

        private static PropertyInfo<int> m_Codigo = RegisterProperty<int>(c => c.Codigo);
        public int Codigo
        {
            get { return GetProperty(m_Codigo); }
            set { SetProperty(m_Codigo, value); }
        }

        private static PropertyInfo<string> m_Descripcion = RegisterProperty<string>(c => c.Descripcion);
        public string Descripcion
        {
            get { return GetProperty(m_Descripcion); }
            set { SetProperty(m_Descripcion, value); }
        }

        private static PropertyInfo<int> m_Cantidad = RegisterProperty<int>(c => c.Cantidad);
        public int Cantidad
        {
            get { return GetProperty(m_Cantidad); }
            set { SetProperty(m_Cantidad, value); CalculaValores(); }
        }

        private static PropertyInfo<decimal> m_PrecioUnitario = RegisterProperty<decimal>(c => c.PrecioUnitario);
        public decimal PrecioUnitario
        {
            get { return GetProperty(m_PrecioUnitario); }
            set { SetProperty(m_PrecioUnitario, value); CalculaValores(); }
        }


        private static PropertyInfo<Decimal> m_Total = RegisterProperty<Decimal>(c => c.Total);
        public Decimal Total
        {
            get { return GetProperty(m_Total); }
        }

        public bool Equals(FacturaDetalle other)
        {
            //Comprobamos que no exista el mismo producto en la colección
            return other.IdProducto.Equals(ReadProperty(m_IdProducto));
        }

        private void CalculaValores()
        {
            SetProperty(m_Total,
                (ReadProperty(m_Cantidad) * ReadProperty(m_PrecioUnitario)));
        }

        #endregion //Propiedades públicas

        #region Reglas Validación

        protected override void AddBusinessRules()
        {
            ValidationRules.AddRule(CommonRules.StringRequired, m_Producto);
            ValidationRules.AddRule(CommonRules.MinValue<Int32>,
                                        new CommonRules.MinValueRuleArgs<Int32>(m_Cantidad, 1));
        }

        #endregion //Reglas Validación

        #region Métodos de instanciación

        public FacturaDetalle()
        { }

        protected override void Child_Create()
        {
            LoadProperty(m_IdFacturaDetalle, Guid.NewGuid().ToString());
        }

        public static FacturaDetalle GetFacturaDetalle(Detalle dr)
        {
            return DataPortal.FetchChild<FacturaDetalle>(dr);
        }


        #endregion // Métodos de instanciación

        #region Data Access

        #region Data Access - Fetch
        private void Child_Fetch(Detalle dr)
        {
            LoadProperty(m_IdFacturaDetalle, dr.IdFacturaDetalle);
            LoadProperty(m_IdProducto, dr.IdProducto);
            LoadProperty(m_Codigo, dr.Mercaderia.Codigo);
            LoadProperty(m_Descripcion, dr.Mercaderia.Descripcion);
            LoadProperty(m_Cantidad, dr.Cantidad);
            LoadProperty(m_PrecioUnitario, dr.PrecioUnitario);
            LoadProperty(m_Total, dr.Total);
            MarkOld();
        }
        #endregion

        #region Data Access - Delete

        private void Child_DeleteSelf()
        {
            using (var ctx = ContextManager<DemoCSLADataContext>
                .GetManager(Contexto.DemoCSLA))
            {

                var detalle = Detalle.GetDetalleById(ctx.DataContext, this.IdFacturaDetalle);
                ctx.DataContext.Detalles.DeleteOnSubmit(detalle);
                ctx.DataContext.SubmitChanges();

                FieldManager.UpdateChildren(this);
            }
        }

        #endregion // Data Access - Delete

        #region Data Access - Update

        private void Child_Update(FacturaCabecera parent)
        {
            using (var ctx = ContextManager<DemoCSLADataContext>
                .GetManager(Contexto.DemoCSLA))
            {
                if (IsSelfDirty)
                {
                    var detalle = Detalle.GetDetalleById(ctx.DataContext, this.IdFacturaDetalle);

                    DoInsertUpdate(detalle);

                    MarkOld();

                }
                FieldManager.UpdateChildren(this);
            }

        }

        #endregion //Data Access - Update

        #region Data Access - Insert

        private void Child_Insert(FacturaCabecera parent)
        {
            using (var ctx = ContextManager<DemoCSLADataContext>
                           .GetManager(Contexto.DemoCSLA))
            {
        
                var detalle = new Detalle();
                detalle.IdFacturaCabecera = parent.IdFacturaCabecera;
                DoInsertUpdate(detalle);

                ctx.DataContext.Detalles.InsertOnSubmit(detalle);

                MarkOld();

                FieldManager.UpdateChildren(this);
            }

        }

        #endregion //Data Access - Insert

        #region DoInsertUpdate

        private void DoInsertUpdate(Detalle cmd)
        {
            cmd.IdFacturaDetalle = ReadProperty(m_IdFacturaDetalle);
            cmd.IdProducto = ReadProperty(m_IdProducto);
            cmd.Cantidad = ReadProperty(m_Cantidad);
            cmd.PrecioUnitario = ReadProperty(m_PrecioUnitario);
            cmd.Total = ReadProperty(m_Total);
        }

        #endregion //DoInsertUpdate

        #endregion //Data Access


    }

}
